﻿Same codebase as KuruFev
Registers at 800A9B50

800263C4()	0x17C4	read hardware switches
80026578()

80026AEC()	0x1EEC	set registers at 800A9B50
80026B58()

8002DABC()
8002DB0C()		read controller input
8002DBE4()		???; reads controller input
8002DC5C()		???; reads controller input
8002DD20()		disables controller reading	[1->800A6B28]
8002DD50()		enables controller reading	[0->800A6B28]
8002DD80()

8003B338(target)	0x16738	read controller input from buffer 800A6A70 to A0
8003B3D4()	0x167D4	write PIF controller read request to 800A6A70
8003B490()

800507C0	p->function executed after reading controller input

80055688	inverse of hardware switches

800A6B28	if True disables controller reading

800A6D98	controller feed; 6 bytes each
800A6DB0	#controllers connected

800A9B50	hardware mappings

Copy regs from bootstrap to mutable.
80025C00()	0x1000	initialize program
3C088005	LUI	T0,8005
3C0A8013	LUI	T2,8013
25085670	ADDIU	T0,T0,5670
254AAE70	ADDIU	T2,T2,AE70
AD000000	SW	R0,0000 (T0)
AD000004	SW	R0,0004 (T0)
150AFFFD	BNE	T0,T2,-3
21080008	ADDI	T0,T0,0008
3C0AA460	LUI	T2,A460	# Nothing will be using the PI
240901C0	ADDIU	T1,R0,01C0	# Target is 800001C0
3C081000	LUI	T0,1000
AD490000	SW	T1,0000 (T2)
25080C00	ADDIU	T0,T0,0C00	# Source is B0000C00 so you can set DIPs w/o checksum recalc
2409000F	ADDIU	T1,R0,000F
AD480004	SW	T0,0004 (T2)
AD49000C	SW	T1,000C (T2)
3C0A8002	LUI	T2,8002
254A65D0	ADDIU	T2,T2,65D0
3C1D800A	LUI	SP,800A
01400008	JR	T2
27BD6A70	ADDIU	SP,SP,6A70

80026AEC()	0x1EEC	set registers at 800A9B50
3C038000	LUI	V1,8000
3C020040	LUI	V0,0040
AC830000	SW	V1,0000 (A0)
AC820004	SW	V0,0004 (A0)
3C038040	LUI	V1,8040
24024000	ADDIU	V0,R0,4000
AC830010	SW	V1,0010 (A0)
AC820014	SW	V0,0014 (A0)
3C03A000	LUI	V1,A000
24020400	ADDIU	V0,R0,0400
246301C0	ADDIU	V1,V1,01C0
AC82000C	SW	V0,000C (A0)
AC830008	SW	V1,0008 (A0)
3C028004	LUI	V0,8004
3C038005	LUI	V1,8005
2442B38C	ADDIU	V0,V0,B38C
03E00008	JR	RA
AC6207C0	SW	V0,07C0 (V1)

@8034F9CC	0xF774C	enable controller reading
0C00B754	JAL	8002DD50

Service button doesn't appear to have an active role (basically adds a credit).  Leave unmapped; R will be button C.

Clear some room.  Diminish 8003B338.
8003B338()	0x16738	read controller input from buffer 800A6A70 to A0
3C08800A	LUI	T0,800A
91076DB0	LBU	A3,6DB0 (T0)
25086A70	ADDIU	T0,T0,6A70
18E0000F	BLEZ	A3,return
000738C0	SLL	A3,A3,0x3
01073821	ADDU	A3,T0,A3
@ loopus
91020002	LBU	V0,0002 (T0)
304200C0	ANDI	V0,V0,00C0
00021102	SRL	V0,V0,0x4
00001825	OR	V1,R0,R0	# This ensures a non-existant controller doesn't set all buttons high
54400002	BNEL	V0,R0,+2
A0820004	SB	V0,0004 (A0)
95030004	LHU	V1,0004 (T0)	# Actual button feed
95020006	LHU	V0,0006 (T0)	# Analog feed; unused but relevant.
A4830000	SH	V1,0000 (A0)
A4820002	SH	V0,0002 (A0)
25080008	ADDIU	T0,T0,0008
1507FFF4	BNE	T0,A3,loopus
24840006	ADDIU	A0,A0,0006
@ return
03E00008	JR	RA
00000000	NOP

3C08800A 91076DB0 25086A70 18E0000F 000738C0 01073821 91020002 304200C0 00021102 00001825 54400002 A0820004 95030004 95020006 A4830000 A4820002 25080008 1507FFF4 24840006 03E00008 00000000

8003B38C()	0x1678C	controller to joystick+switch feed
	accepts: A0=p->some fool stupid thing I don't need to mess with
00000825	OR	AT,R0,R0
00002825	OR	A1,R0,R0
00003025	OR	A2,R0,R0
3C07800A	LUI	A3,800A
@ loopus
94E46D98	LHU	A0,6D98 (A3)
00052A02	SRL	A1,A1,0x8
3082002C	ANDI	V0,A0,002C	#L, c-up, c-down
30831000	ANDI	V1,A0,1000	#Start
00C23025	OR	A2,A2,V0
30822000	ANDI	V0,A0,2000	#Z
00231804	SLLV	V1,V1,AT
00021242	SRL	V0,V0,0x9
00031B02	SRL	V1,V1,0xC
00C23025	OR	A2,A2,V0
30820800	ANDI	V0,A0,0800	#+up
00C33025	OR	A2,A2,V1
000210C2	SRL	V0,V0,0x3
30830010	ANDI	V1,A0,0010	#R
00A22825	OR	A1,A1,V0
00031280	SLL	V0,V1,0xA
30830400	ANDI	V1,A0,0400	#+down
00A22825	OR	A1,A1,V0
3082C000	ANDI	V0,A0,C000	#A, B
00031842	SRL	V1,V1,0x1
00021082	SRL	V0,V0,0x2
00A32825	OR	A1,A1,V1
30830100	ANDI	V1,A0,0100	#+right
00A22825	OR	A1,A1,V0
000318C0	SLL	V1,V1,0x3
30820200	ANDI	V0,A0,0200	#+left
00021040	SLL	V0,V0,0x1
00A32825	OR	A1,A1,V1
00A22825	OR	A1,A1,V0
24E70006	ADDIU	A3,A3,0006
1020FFE1	BEQ	AT,R0,loopus
24210001	ADDIU	AT,AT,0001
@ set
3C04800B	LUI	A0,800B
00052827	NOR	A1,R0,A1
8C849B58	LW	A0,9B58 (A0)
00063027	NOR	A2,R0,A2
A4850002	SH	A1,0002 (A0)
03E00008	JR	RA
A4860004	SH	A2,0004 (A0)

00000825 00002825 00003025 3C07800A 94E46D98 00052A02 3082002C 30831000 00C23025 30822000 00231804 00021242 00031B02 00C23025 30820800 00C33025 000210C2 30830010 00A22825 00031280 30830400 00A22825 3082C000 00031842 00021082 00A32825 30830100 00A22825 000318C0 30820200 00021040 00A32825 00A22825 24E70006 1020FFE1 24210001 3C04800B 00052827 8C849B58 00063027 A4850002 03E00008 A4860004

Diminish 80 to make room for above code.  Move references.
->	8003B2D8()	0x166D8
8003B43C()	0x1683C	write PIF controller read request to 800A6A70
3C01800A	LUI	AT,800A
24276A70	ADDIU	A3,AT,6A70
24E20038	ADDIU	V0,A3,0038
AC400000	SW	R0,0000 (V0)
1447FFFE	BNE	V0,A3,-2
2442FFFC	ADDIU	V0,V0,FFFC
24050001	ADDIU	A1,R0,0001
90246DB0	LBU	A0,6DB0 (AT)
00003021	ADDU	A2,R0,R0
AC256AAC	SW	A1,6AAC (AT)
3C02FF01	LUI	V0,FF01
34420401	ORI	V0,V0,0401
2403FFFF	ADDIU	V1,R0,FFFF
ACE20000	SW	V0,0000 (A3)
ACE30004	SW	V1,0004 (A3)
24E70008	ADDIU	A3,A3,0008
14A4FFFC	BNE	A1,A0,-4
24A50001	ADDIU	A1,A1,0001
240200FE	ADDIU	V0,R0,00FE
03E00008	JR	RA
A0E20000	SB	V0,0000 (A3)

3C01800A 24276A70 24E20038 AC400000 1447FFFE 2442FFFC 24050001 90246DB0 00003021 AC256AAC 3C02FF01 34420401 2403FFFF ACE20000 ACE30004 24E70008 14A4FFFC 24A50001 240200FE 03E00008 A0E20000
